ci: Add a check that submodule changes include "Update submodule: "
authorColin Walters <walters@verbum.org>
Thu, 30 Mar 2017 20:47:57 +0000 (16:47 -0400)
committerAtomic Bot <atomic-devel@projectatomic.io>
Tue, 4 Apr 2017 15:44:19 +0000 (15:44 +0000)
To prevent repeats of https://github.com/ostreedev/ostree/pull/693

I tested this script in https://github.com/cgwalters/playground/pull/48

Closes: #770
Approved by: jlebon

.redhat-ci.Dockerfile
.redhat-ci.yml
tests/ci-commitmessage-submodules.sh [new file with mode: 0755]

index 86d26dfafabbba29f2bc92bd7cd95f4b650629ac..0081998c21c8756a50c2960c9e1a3d4077a0eb9c 100644 (file)
@@ -2,6 +2,7 @@ FROM fedora:25
 
 RUN dnf install -y \
         gcc \
+        git \
         sudo \
         which \
         attr \
index 2fce02b8cb4cdbf7f3264b17f6eb37c4dc30d24c..9eaf93cac685cc7d4dfbbaa0f25522447a9dba32 100644 (file)
@@ -11,6 +11,7 @@ container:
 
 packages:
   - libasan
+  - git
   - coccinelle
 
 env:
@@ -27,6 +28,7 @@ build:
 
 tests:
     - make syntax-check
+    - ./tests/ci-commitmessage-submodules.sh
     - make check
     - gnome-desktop-testing-runner -p 0 ostree
 
diff --git a/tests/ci-commitmessage-submodules.sh b/tests/ci-commitmessage-submodules.sh
new file mode 100755 (executable)
index 0000000..77a4e1a
--- /dev/null
@@ -0,0 +1,49 @@
+#!/bin/bash
+set -euo pipefail
+# Copyright 2017 Colin Walters <walters@verbum.org>
+# Licensed under the new-BSD license (http://www.opensource.org/licenses/bsd-license.php)
+
+# This script is intended to be used as a CI gating check
+# that if a submodule is changed, the commit message contains
+# the text:
+#
+#  Update submodule: submodulepath
+#
+# It's very common for people to accidentally change submodules, and having this
+# requirement is a small hurdle to pass.
+
+tmpd=$(mktemp -d)
+touch ${tmpd}/.tmpdir
+cleanup_tmp() {
+    # This sanity check ensures we don't delete something else
+    if test -f ${tmpd}/.tmpdir; then
+        rm -rf ${tmpd}
+    fi
+}
+trap cleanup_tmp EXIT
+
+gitdir=$(pwd)
+# Create a temporary copy of this (using cp not git clone) so git doesn't
+# try to read the submodules from the Internet again.  If we wanted to
+# require a newer git, we could use `git worktree`.
+cp -a ${gitdir} ${tmpd}/workdir
+cd ${tmpd}/workdir
+git log --pretty=oneline origin/master.. | while read logline; do
+    commit=$(echo ${logline} | cut -f 1 -d ' ')
+    git diff --name-only ${commit}^..${commit} > ${tmpd}/diff.txt
+    git log -1 ${commit} > ${tmpd}/log.txt
+    echo "Validating commit for submodules: $commit"
+    git checkout -q "${commit}"
+    git submodule update --init
+    git submodule foreach --quiet 'echo $path'| while read submodule; do
+        if grep -q -e '^'${submodule} ${tmpd}/diff.txt; then
+            echo "Commit $commit modifies submodule: $submodule"
+            expected_match="Update submodule: $submodule"
+            if ! grep -q -e "$expected_match" ${tmpd}/log.txt; then
+                echo "error: Commit message for ${commit} changes a submodule, but does not match regex ${expected_match}"
+                exit 1
+            fi
+            echo "Verified commit $commit matches regexp ${expected_match}"
+        fi
+    done
+done